#include <iostream>
#include <mutex>

/*饿汉模式*/
// class Hungry
// {
// public:
//     static Hungry& GetInstance()
//     {
//         return _hungry;
//     }

//     Hungry(const Hungry&)=delete;
//     Hungry& operator=(const Hungry&) const=delete;
// private:
//     ~Hungry()
//     {
//         std::cout<<"释放\n";
//     }
//     Hungry()
//     {
//         std::cout<<"创建\n";
//     }

// private:
//     static Hungry _hungry;
// };
// Hungry Hungry::_hungry;

/*懒汉模式1(双判断版本)*/
class Lazy
{
public:
    static Lazy* GetInstance()
    {
        if(_ptr==nullptr)
        {
            std::unique_lock<std::mutex>(_mutex);
            if(_ptr==nullptr)
            {
                _ptr=new Lazy();
            }
        }
        return _ptr;
    }

    Lazy(const Lazy&)=delete;
    Lazy& operator=(const Lazy&) const=delete;
private:
    Lazy()
    {
        std::cout<<"创建\n";
    }

    ~Lazy()
    {
        std::cout<<"释放\n";
    }

private:
    std::mutex _mutex;
    static Lazy* _ptr;
};
Lazy* Lazy::_ptr=nullptr;

/*懒汉模式2(C++11版本)*/
// class Lazy
// {
// public:
//     static Lazy& GetInstance()
//     {
//         static Lazy lazy;
//         return lazy;
//     }

//     Lazy(const Lazy&)=delete;
//     Lazy& operator=(const Lazy&) const=delete;

// private:
//     Lazy()
//     {
//         std::cout<<"创建\n";
//     }

//     ~Lazy()
//     {
//         std::cout<<"释放\n";
//     }
// };

int main()
{
    //饿汉模式
    // std::cout<<"begin\n";
    // Hungry::GetInstance();
    // std::cout<<"end\n";
    
    //懒汉模式1(双判断版本)
    std::cout<<"begin\n";
    Lazy::GetInstance();
    std::cout<<"end\n";

    //懒汉模式2(C++11版本)
    // std::cout<<"begin\n";
    // Lazy::GetInstance();
    // std::cout<<"end\n";

    return 0;
}